001    /* EVolve - an Extensible Software Visualization Framework
002     * Copyright (C) 2001-2002 Qin Wang
003     *
004     * This library is free software; you can redistribute it and/or
005     * modify it under the terms of the GNU Library General Public
006     * License as published by the Free Software Foundation; either
007     * version 2 of the License, or (at your option) any later version.
008     *
009     * This library is distributed in the hope that it will be useful,
010     * but WITHOUT ANY WARRANTY; without even the implied warranty of
011     * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
012     * Library General Public License for more details.
013     *
014     * You should have received a copy of the GNU Library General Public
015     * License along with this library; if not, write to the
016     * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
017     * Boston, MA 02111-1307, USA.
018     */
019    
020    /*
021     * EVolve is distributed at http://www.sable.mcgill.ca/EVolve/
022     */
023    
024    package EVolve.data;
025    
026    import EVolve.*;
027    import EVolve.exceptions.DataProcessingException;
028    import EVolve.exceptions.EVolveException;
029    import EVolve.visualization.*;
030    import java.awt.*;
031    import java.util.*;
032    import java.io.File;
033    
034    public class DataManager implements Worker{
035        private DataSource dataSource;
036        private ElementDefinition[] definition;
037        private ReferenceLink[] link;
038        private HashMap[] entity;
039        private ElementFilter[][] elementFilter;
040        private Color color;
041        private int colorRGB;
042        private long eventCounter;
043        private long[] eventInterval;
044        private int currentInterval;
045        private boolean dataProcessed;
046        private boolean dataLoaded;
047        private int state;
048    
049    
050        public DataManager(DataSource dataSource) {
051            this.dataSource = dataSource;
052            this.eventCounter = 0;
053            dataLoaded = false;
054        }
055    
056        public void init() throws EVolveException {
057            ElementBuilder.init();
058    
059            dataSource.init();
060    
061            dataSource.startBuildDefinition();
062    
063            ArrayList definitionList = new ArrayList();
064            ElementDefinition nextDefinition = dataSource.getNextDefinition();
065            while (nextDefinition != null) {
066                definitionList.add(nextDefinition);
067                nextDefinition = dataSource.getNextDefinition();
068            }
069    
070            definition = new ElementDefinition[definitionList.size()];
071            for (int i = 0; i < definition.length; i++) {
072                definition[((ElementDefinition)(definitionList.get(i))).getType()] = (ElementDefinition)(definitionList.get(i));
073            }
074    
075            /*ArrayList[] entityList = new ArrayList[definition.length];
076            for (int i = 0; i < entityList.length; i++) {
077                entityList[i] = new ArrayList();
078            }*/
079    
080            entity = new HashMap[definition.length];
081            for (int i = 0; i < entity.length; i++) {
082                entity[i] = new HashMap();
083            }
084    
085            dataSource.startBuildEntity();
086    
087            /*Entity nextEntity = dataSource.getNextEntity();
088            while (nextEntity != null) {
089                entityList[nextEntity.getType()].add(nextEntity);
090                nextEntity = dataSource.getNextEntity();
091            }*/
092    
093            Entity nextEntity = dataSource.getNextEntity();
094            while (nextEntity != null) {
095                int type = nextEntity.getType();
096                entity[type].put(new Long(nextEntity.getId()),nextEntity);
097                nextEntity = dataSource.getNextEntity();
098            }
099    
100            /*entity = new Entity[entityList.length][];
101    
102            for (int i = 0; i < entity.length; i++) {
103                entity[i] = new Entity[entityList[i].size()];
104                for (int j = 0; j < entity[i].length; j++) {
105                    entity[i][((Entity)(entityList[i].get(j))).getId()] = (Entity)(entityList[i].get(j));
106                }
107            }*/
108    
109            // creates links
110            ArrayList list = new ArrayList();
111            for (int i = 0; i < definition.length; i++) {
112                for (int j = 0; j < definition[i].getFieldDefinition().length; j++) {
113                    if ((definition[i].getFieldDefinition()[j].getReference() != -1) &&
114                        (definition[i].getFieldDefinition()[j].getReference() != i)) {
115                        list.add(new ReferenceLink(definition[i].getFieldDefinition()[j].getName(), i,
116                                 j, definition[i].getFieldDefinition()[j].getReference(),
117                                 definition[i].getFieldDefinition()[j].getDescription(),
118                                 definition[i].getFieldDefinition()[j].getProperties()));
119                    }
120                }
121            }
122    
123            int head = 0;
124            int tail = list.size();
125            int initSize = list.size();
126    
127            while (head < tail) {
128                for (int i = head; i < tail; i++) {
129                    for (int j = 0; j < initSize; j++) {
130                        ReferenceLink from = (ReferenceLink)(list.get(j));
131                        ReferenceLink to = (ReferenceLink)(list.get(i));
132                        if ((from.getTargetType() == to.getSourceType()) && (from.getSourceType() != to.getTargetType())) {
133                            list.add(new ReferenceLink(from, to));
134                        }
135                    }
136                }
137                head = tail;
138                tail = list.size();
139            }
140    
141            link = new ReferenceLink[list.size()];
142            for (int i = 0; i < link.length; i++) {
143                link[i] = (ReferenceLink)(list.get(i));
144            }
145        }
146    
147        public void sendEvents() throws DataProcessingException {
148    
149            state = Worker.STATE_RUNNING;
150    
151            Selection[] selection = Scene.getFilter().getSelection();
152            Selection activeSelection = Scene.getFilter().getActiveSelection();
153            dataProcessed = false;
154            if (activeSelection != null) {
155                eventInterval = new long[4];
156                eventInterval[0] = 0;
157                eventInterval[1] = activeSelection.getStart();
158                eventInterval[2] = activeSelection.getEnd();
159                eventInterval[3] = Integer.MAX_VALUE;
160            } else {
161                eventInterval = new long[2];
162                eventInterval[0] = 0;
163                eventInterval[1] = Integer.MAX_VALUE;
164            }
165    
166            elementFilter = new ElementFilter[eventInterval.length - 1][definition.length];
167            for (int i = 0; i < elementFilter.length; i++) {
168                boolean isIncluded = activeSelection == null ? true : false;
169                for (int j = 0; j < selection.length; j++) {
170                    if ((selection[j] == activeSelection)&&(selection[j].getStart() >= eventInterval[i])&&(selection[j].getEnd() <= eventInterval[i+1])) {
171                        isIncluded = true;
172                        break;
173                    }
174                }
175    
176                if (isIncluded)
177                {
178                    ArrayList list = new ArrayList();
179                    if (activeSelection != null) list.add(activeSelection);
180                    for (int j = 0; j < selection.length; j++) {
181                        if ((selection[j].getColor()!=null) && (selection[j] != activeSelection)) {
182                            list.add(selection[j].specialClone());
183                        }
184                    }
185                    Selection[] tempSelection = new Selection[list.size()];
186                    for (int j = 0; j < tempSelection.length; j++) {
187                        tempSelection[j] = (Selection)(list.get(j));
188                    }
189    
190                    for (int j = 0; j < definition.length; j++) {
191                        if (Scene.getVisualizationManager().getVisualizationType().indexOf("" + j + "") != -1) {
192                            elementFilter[i][j] = new ElementFilter(definition[j], tempSelection);
193                        } else {
194                            elementFilter[i][j] = null;
195                        }
196                    }
197                } else {
198                    elementFilter[i] = null;
199                }
200    
201            }
202    
203            currentInterval = 0;
204    
205            dataSource.startBuildEvent();
206            eventCounter = 0;
207    
208            Event nextEvent = dataSource.getNextEvent();
209            while (nextEvent != null) {
210    
211                if (state == STATE_PAUSING) {
212                    try {
213                        synchronized(this) {
214                            this.state = STATE_PAUSED;
215                            wait();
216                        }
217                        state = STATE_RUNNING;
218                    } catch (InterruptedException e) {
219                        if (state == STATE_STOPPING) {
220                            state = STATE_STOPPED;
221                            throw new DataProcessingException("Data processing cancelled by the user.");
222                        }
223                    }
224                } else if (state == STATE_STOPPING) {
225                    state = STATE_STOPPED;
226                    throw new DataProcessingException("Data processing cancelled by the user.");
227                }
228    
229    
230                if ((elementFilter[currentInterval] != null) && (elementFilter[currentInterval][nextEvent.getType()] != null)) {
231                    color = elementFilter[currentInterval][nextEvent.getType()].getColor(nextEvent);
232                    if (color != null) {
233                        colorRGB = color.getRGB();
234                        Scene.getVisualizationManager().receiveEvent(nextEvent);
235                    }
236                }
237    
238                if (eventCounter == eventInterval[currentInterval + 1]) {
239                    currentInterval++;
240                }
241    
242                eventCounter++;
243                nextEvent = dataSource.getNextEvent();
244            }
245            dataProcessed = true;
246            state = STATE_FINISHED;
247        }
248    
249        public HashMap[] getEntity() {
250            return entity;
251        }
252    
253        public ElementDefinition[] getElementDefinition() {
254            return definition;
255        }
256    
257        public ElementDefinition[] getElementDefinition(VisualizationDefinition visualizationDefinition) {
258            ArrayList list = new ArrayList();
259            for (int i = 0; i < definition.length; i++) {
260                boolean add = true;
261                for (int j = 0; j < visualizationDefinition.getDimensionDefinition().length; j++) {
262                    DataFilter[] temp = getDataFilter(definition[i], visualizationDefinition.getDimensionDefinition()[j].getProperty());
263                    if (temp.length == 0) {
264                        add = false;
265                        break;
266                    }
267                }
268                if (add) {
269                    list.add(definition[i]);
270                }
271            }
272    
273            ElementDefinition[] returnVal = new ElementDefinition[list.size()];
274            for (int i = 0; i < returnVal.length; i++) {
275                returnVal[i] = (ElementDefinition)(list.get(i));
276            }
277    
278            return returnVal;
279        }
280    
281        public DataFilter[] getDataFilter(ElementDefinition subjectDefinition, String property) {
282            ArrayList list = new ArrayList();
283            FieldDefinition fd;
284            boolean nonLinkField = true;
285    
286            for (int i = 0; i<link.length; i++) {
287                if (link[i].hasProperty(property)) {
288                    if (link[i].getSourceType() == subjectDefinition.getType()) {
289                        list.add(new DataFilter(link[i].getName(), link[i].getSourceIndex(), link[i], link[i].getDescription(),null));
290                    }
291                    nonLinkField = false;
292                }
293            }
294    
295            if (nonLinkField) {
296                for (int i = 0; i < subjectDefinition.getFieldDefinition().length; i++) {
297                    fd = subjectDefinition.getFieldDefinition()[i];
298                    if (subjectDefinition.getFieldDefinition()[i].hasProperty(property)) {
299                        list.add(new DataFilter(subjectDefinition.getFieldDefinition()[i].getName(), i,
300                                                null, subjectDefinition.getFieldDefinition()[i].getDescription(),fd.getProperties()));
301                    }
302                }
303            }
304    
305            DataFilter[] returnVal = new DataFilter[list.size()];
306            for (int i = 0; i < returnVal.length; i++) {
307                returnVal[i] = (DataFilter)(list.get(i));
308            }
309    
310            return returnVal;
311        }
312    
313        public Color getColor() {
314            return color;
315        }
316    
317        public int getColorRGB() {
318            return colorRGB;
319        }
320    
321        public long getEventCounter() {
322            return eventCounter;
323        }
324    
325        public ReferenceLink[] getReferenceLink() {
326            return link;
327        }
328    
329        public boolean isCompleted() {
330            return dataProcessed;
331        }
332    
333        public String getDatasourceName() {
334            String fileName = dataSource.getFileName();
335    
336            if (fileName == null)
337                fileName = "No Data";
338            else
339                fileName = fileName.substring(fileName.lastIndexOf(File.separatorChar)+1);
340    
341            return dataSource.getName()+" - "+fileName;
342        }
343    
344        public boolean isDataLoaded() {
345            return dataLoaded;
346        }
347    
348        public void setDataLoaded(boolean loaded) {
349            dataLoaded = loaded;
350        }
351    
352        public DataSource getDataSource() {
353            return dataSource;
354        }
355    
356        public synchronized void resume() {
357            notifyAll();
358        }
359    
360        public synchronized void pause() {
361            if (state == STATE_RUNNING) {
362                state = STATE_PAUSING;
363            }
364        }
365    
366        public synchronized void stop() {
367            switch (state) {
368                case STATE_NOT_STARTED:
369                case STATE_STOPPED:
370                case STATE_FINISHED:
371                    break;
372                default:
373                    state = STATE_STOPPING;
374                    break;
375            }
376        }
377    
378        public synchronized long getCurrentProgress() {
379            return eventCounter;
380        }
381    
382        public synchronized long getMaxProgress() {
383            return dataSource.getTotalNumberOfEvents();
384            //return 100;
385        }
386    
387        public synchronized int getCurrentState() {
388            return state;
389        }
390    
391        public synchronized void start() {
392            state = STATE_RUNNING;
393        }
394    
395        public void join() throws InterruptedException {
396        }
397    
398        public void resetState() {
399            state = Worker.STATE_NOT_STARTED;
400        }
401    }